import os
import csv
from xml.etree.ElementTree import parse

###################################
##### defining class "parser" #####
###################################

class writer:

    def __init__(self, x):
        self.appnumber = str(x[:-4])
        self.year = self.appnumber[2:6]
        self.xmldir = 'D:\\KIPRIS\\Citation\\'+str(self.year) + '\\' + str(self.appnumber) + ".xml"
        try :
            tree = parse(self.xmldir)
            self.parse_error = 0
        except :
            self.parse_error = 1
        if self.parse_error ==0:
            tree = parse(self.xmldir)
            self.note = tree.getroot()
        else :
            self.note = None
    
    def citation(self):
        if self.note != None:
            citationlist = self.note.find("body").find("items").findall("citationInfoV3")
            for i in range(len(citationlist)):
                ##### 순위 #####
                order = i+1
                ##### Citing appnumber #####
                if citationlist[i].find("ApplicationNumber") != None:
                    ApplicationNumber = citationlist[i].find("ApplicationNumber").text
                else :
                    ApplicationNumber=''
                ##### Cited 국가 코드 #####
                if citationlist[i].find("StandardCitationLiteratureCountryCode")!= None:
                    StandardCitationLiteratureCountryCode = citationlist[i].find("StandardCitationLiteratureCountryCode").text
                else:
                    StandardCitationLiteratureCountryCode=''
                ##### Cited 특허 번호 #####
                if citationlist[i].find("StandardCitationLiteraturenumber")!= None:
                    StandardCitationLiteraturenumber = citationlist[i].find("StandardCitationLiteraturenumber").text
                else :
                    StandardCitationLiteraturenumber =''
                ##### Cited 분류 코드(특허, 실용신안 등) #####
                if citationlist[i].find("StandardCitationIdentificationCode") !=None:
                    StandardCitationIdentificationCode = citationlist[i].find("StandardCitationIdentificationCode").text
                else:
                    StandardCitationIdentificationCode=''
                ##### Cited 발행일자 #####
                if citationlist[i].find("StandardCitationLiteraturePublicationDate") != None:
                    StandardCitationLiteraturePublicationDate = citationlist[i].find("StandardCitationLiteraturePublicationDate").text[:-3]
                else:
                    StandardCitationLiteraturePublicationDate=''
                ##### 인용문헌 구분코드 #####
                if citationlist[i].find("CitationLiteratureTypeCodeName") != None:
                    CitationLiteratureTypeCodeName = citationlist[i].find("CitationLiteratureTypeCodeName").text
                else:
                    CitationLiteratureTypeCodeName=''
                ##### 인용문헌 구분코드명 #####
                if citationlist[i].find("CitationLiteratureTypeCode") != None:
                    CitationLiteratureTypeCode = citationlist[i].find("CitationLiteratureTypeCode").text
                else:
                    CitationLiteratureTypeCode=''
                row = [str(self.appnumber), str(order), str(StandardCitationLiteratureCountryCode), str(StandardCitationLiteraturenumber), str(StandardCitationIdentificationCode),  str(StandardCitationLiteraturePublicationDate), str(CitationLiteratureTypeCodeName), str(CitationLiteratureTypeCode)]
                wrcitation.writerow(row)
        else :
            pass

################################################################################################################################
################################################################################################################################
################################################################################################################################

errorlist = []

for year in range(1948 , 2017):

    ###################################
    ##### Opening Blank csv files #####
    ###################################

    citation = open('D:\\KIPRIS\\Citation\\csv\\citation_' +str(year) + '.csv', 'w', encoding='utf-8', newline='')
    wrcitation = csv.writer(citation)
    wrcitation.writerow(["citing", "order", "cited_ctr", "cited_num", "cited_code", "cited_date", "cited_typecodename", "cited_typecode"])

    ############################
    ##### Parsing, Writing #####
    ############################

    xmllist = os.listdir('D:\\KIPRIS\\Citation\\'+str(year))
    for files in xmllist:
        a = writer(files)
        if a.parse_error ==1:
            errorlist.append(a.appnumber)
        else:
            pass
        a.citation()
        print(str(a.appnumber))

    #############################
    ##### Closing csv files #####
    #############################

    citation.close()


############################
##### Saving errorlist #####
############################

with open("D:\\KIPRIS\\Citation\\csv\\errorlist.csv", "w", newline = '') as errorlist_csv:
    wr = csv.writer(errorlist_csv)
    wr.writerow(errorlist)